<?php
/**
 * This is the template for generating a controller class file for CRUD feature.
 * The following variables are available in this template:
 * - $this: the CrudCode object
 */
?>
<?php echo "<?php\n"; ?>

class <?php echo $this->controllerClass; ?> extends <?php echo $this->baseControllerClass."\n"; ?>
{
	// Количество элементов на страницу
	const ITEMS_PER_PAGE = 20;

	public function init()
	{
		$this->menu=array(
			array('label'=>'Создать', 'url'=>array('/<?php echo strtolower($this->modelClass); ?>/create')),
			array('label'=>'Список', 'url'=>array('/<?php echo strtolower($this->modelClass); ?>/index')),
		);
		parent::init();
	}
	
	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // позволяет опредить права доступа к страницам
		);
	}

	/**
	 * Определение прав доступа к страницам
	 * Этот метод используется фильтром 'accessControl'
	 * @return массив правил доступа
	 */
	public function accessRules()
	{
		return array(
			// Позволяет всем авторизованным пользователям 
			// зайти на страницу index и view
			array('allow',  
				'actions'=>array('index','view'),
				'users'=>array('@'),
			),
			// Позволяет всем пользователям, которые принадлежат ролям admin, manager и developer
			// зайти на страницу create и update
			array('allow',
				'actions'=>array('create','update'),
				'roles'=>array('admin', 'manager', 'developer'),
			),
			// Позволяет всем пользователям, которые принадлежат ролям admin и manager
			// зайти на страницу admin, а также удалять модели
			array('allow',
				'actions'=>array('admin','delete'),
				'roles'=>array('admin', 'manager'),
			),
			// Запретить все всем остальным пользователям
			array('deny',
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Создание новой модели
	 * Если обновление прошло успешно, происходит редирект на страницу списка моделей
	 */
	public function actionCreate()
	{
		// Создаем новый экземпляр класса 
		$model=new <?php echo $this->modelClass; ?>;

		// Если в пост-запросе есть данные, относящиеся к модели
		if(isset($_POST['<?php echo $this->modelClass; ?>']))
		{
			// Заполняем модель данными из POST-запроса
			$model->attributes=$_POST['<?php echo $this->modelClass; ?>'];
			// Если сохранение (запись в БД) прошло успешно, редиректим
			if($model->save())
			{
				// Добавляем сообщение об успешном выполнении действия
				Cookies::set('success', "Элемент создан");
				$this->redirect(array('index'));
			}
		}
		
		// Рендеринг формы создания модели
		$this->render('create',array(
			'model'=>$model,
		));
	}

	/**
	 * Обновление отдельной модели
	 * Если обновление прошло успешно, происходит редирект на страницу списка моделей
	 * @param integer $id ID модели, которая будет обновлена
	 */
	public function actionUpdate($id)
	{
		// Загружаем нужную модель по ID
		$model=$this->loadModel($id);

		// Если в пост-запросе есть данные, относящиеся к модели
		if(isset($_POST['<?php echo $this->modelClass; ?>']))
		{
			// Заполняем модель данными из POST-запроса
			$model->attributes=$_POST['<?php echo $this->modelClass; ?>'];
			// Если сохранение (запись в БД) прошло успешно, редиректим
			if($model->save())
			{
				// Добавляем сообщение об успешном выполнении действия
				Cookies::set('success', "Изменения сохранены");
				$this->redirect(array('index'));
			}
		}
		
		// Рендеринг формы редактирования модели
		$this->render('update',array(
			'model'=>$model,
		));
	}

	/**
	 * Удаление отдельной модели
	 * Если удаление прошло успешно, происходит редирект на страницу списка моделей
	 * @param integer $id ID модели для удаления
	 */
	public function actionDelete($id)
	{
		// Загружаем модель по ID и сразу запускаем удаление
		$this->loadModel($id)->delete();
		// Добавляем сообщение об успешном выполнении действия
		Cookies::set('success', "Элемент удален");
		// Редиректим на страницу управления
		$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
	}

	/**
	 * Список моделей <?php echo $this->modelClass; ?>
	 */
	public function actionIndex()
	{
		// Применяем пагинацию
		$criteria = new CDbCriteria();
		$count = <?php echo $this->modelClass; ?>::model()->count($criteria);
		$pages = new CPagination($count);
		$pages->setPageSize(self::ITEMS_PER_PAGE);
		$pages->applyLimit($criteria);
		// Находим все модели		
		$models = <?php echo $this->modelClass; ?>::model()->findAll($criteria);

		// Отправляем модель-шаблон на страницу
		// Ренерим страницу со списком моделей
		$this->render('index',array(
			'models'=>$models,
			'pages'=>$pages,
		));
	}

	/**
	 * Возвращает модель по первичному ключу из GET параметра
	 * Если модель не найдена - генерируется исключение CHttpException с кодом 404
	 * @param integer $id ID модели для загрузки
	 * @return <?php echo $this->modelClass; ?> загружаемая модель
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=<?php echo $this->modelClass; ?>::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'Запрашиваемая страница не существует');
		return $model;
	}
}
